
// Object.prototype.__lookupGetter__() 将要被废弃

// Object.getOwnPropertyDescriptor()

// Object.getPrototypeOf()


// const obj = {};

// Object.defineProperty(obj, "a", {
//   value: 123,
//   writable: false,
//   enumerable: false
// });

// console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
// { value: 123, writable: false, enumerable: false, configurable: false}

// const obj = {
  // get b() {
  //   return 222;
  // }
// };

// Object.defineProperty(obj, "b", {
//   get() {
//     return 222;
//   }
// });
// console.log(Object.getOwnPropertyDescriptor(obj, 'b'));
// {set: undefined, enumerable: false, configurable: false, get: ƒ}

// obj.__defineGetter__('a', function () {
//   return 222;
// })
// console.log(obj.a);

// const obj = {
//   get a() {
//     return Math.random() >= 0.5 ? 1: 0;
//   }
// }
// 需要：获取a方法， 直接提取
// const fn = obj.a;

// const round = obj.__lookupGetter__('a'); // 将要被废弃

// const round = Object.getOwnPropertyDescriptor(obj, 'a').get

// console.log(round);

// const obj = {};

// const prototype = Object.getPrototypeOf(obj);

// Object.getOwnPropertyDescriptor(prototype, 'a').get
// console.log(prototype);




// const prototype1 = {};

// const obj1 = Object.create(prototype1);

// console.log(Object.getPrototypeOf(obj1) === prototype1); // true

// const obj = {};
// const obj = new Object();

// console.log(Object.getPrototypeOf(Object)); // ƒ () { [native code] }
// console.log(Object.getPrototypeOf(Function)); // ƒ () { [native code] }
// console.log(Object.getPrototypeOf(Object) === Object.getPrototypeOf(Function)); // true
// console.log(Object.getPrototypeOf(Object) === Function.prototype); // true
// console.log(Object.prototype === Function.prototype); // false
// console.log(Object.__proto__ === Function.prototype); // true

// Object.getPrototypeOf( Object )是把Object这一构造函数看作对象
// 返回的当然是函数对象上的原型

// console.log(Object.getPrototypeOf(Object) === Object.prototype); // false
// console.log(Object.getPrototypeOf(obj) === Object.prototype); // true

// console.log(Object.getPrototypeOf('foo'));

/**
 * Object.getOwnPropertyDescriptor()
 * 返回指定对象上一个自有属性对应的属性描述符,否则返回 undefined。
 * 
 * 自有属性指的是直接赋予该对象的属性，不需要从原型链上进行查找的属性
 * 
 * Object.prototype.__lookupGetter__() 虽然将要被废弃 但兼容性非常好，getOwnPropertyDescriptor（）兼容性差点。
 * 
 * 
 * 
 * Object.getPrototypeOf()
 * 返回给定对象的原型。如果没有继承属性，则返回 null
 * 
 * Object.getPrototypeOf(Object)  不是  Object.prototype
 * 
 * 
 * 共同：
 * 传入的参数(Object.getOwnPropertyDescriptor是第一个参数):  如果不是一个对象类型(原始类型)
 * ES5： 抛出一个TypeError异常
 * ES2015： 参数会被强制转换为一个 Object
 */
